﻿using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using NGI_Logica;
using NGI_Auxiliares;
using NGI_Entidades;
using NGI_Enumerador;
using NGI_Mensaje;

namespace NGI_Sistema.Forms
{
    public partial class FacturaA : Form
    {
        #region Propiedades
        private Cliente clienteAFacturar;
        private Boolean Cargando = true;
        private ArrayList _validaciones = new ArrayList();
        #endregion Propiedades

        #region Constructores
        public FacturaA()
        {
            InitializeComponent();
        }
        #endregion Constructores

        #region Eventos
        private void FacturaA_Load(object sender, EventArgs e)
        {
            this.AgregarValidaciones();
            this.CargarNumeroFactura();
            this.CargarCombos();
            this.Cargando = false;
        }

        private void cmbRazonSocial_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (!Cargando)
            {
                this.clienteAFacturar = Clientes.TraerDatosDe(Convert.ToInt32(this.cmbRazonSocial.SelectedValue));
                this.LlenarCampos();
            }
        }

        private void btnEmitir_Click(object sender, EventArgs e)
        {
            if (this.CamposValidos())
            {
                FacturaDetalleElemento[] Detalle = this.CrearListadoDeDetalles();
                FacturaCabecera Cabecera = this.CrearCabecera();
                Factura FacturaActual = Factura.Nuevo(Cabecera, Detalle, TiposFactura.A);
                bool Creada = Facturas.Crear(FacturaActual, Program.SesionActiva.UsuarioLogueado.ID);

                if (Creada)
                {
                    Mensaje.MostrarMensaje(TipoMensajes.OperacionExitosa, TipoCarteles.Ok, TipoBotones.OK);
                }
                else
                {
                    Mensaje.MostrarMensaje(TipoMensajes.OperacionNoExitosa, TipoCarteles.Error, TipoBotones.OK);
                }
            }
        }

        private void ComboBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            ((ComboBox)sender).BackColor = (Color)((ComboBox)sender).SelectedItem;
        }

        private void dgvDetalle_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            Point CeldaActual = dgvDetalle.CurrentCellAddress;
            int productoSeleccionadoId = 0;
            Producto unProducto = new Producto();

            if (CeldaActual.Y >= 0 && CeldaActual.X >= 0 && CeldaActual.X <= 1)
            {
                if (dgvDetalle.Rows[CeldaActual.Y].Cells[1].Value != null)
                {
                    productoSeleccionadoId = Convert.ToInt32(dgvDetalle.Rows[CeldaActual.Y].Cells[1].Value);
                }

                if (productoSeleccionadoId > 0)
                {
                    unProducto = Producto.SinDatos(productoSeleccionadoId);
                    unProducto = Productos.TraerDatosDe(unProducto.ID);
                }

                int cantidadSeleccionada = dgvDetalle.Rows[CeldaActual.Y].Cells[0].Value != null ? Convert.ToInt32(dgvDetalle.Rows[CeldaActual.Y].Cells[0].Value) : 0;
                if (cantidadSeleccionada > 0 && unProducto.ID > 0)
                {
                    Double PrecioUnitario = this.CalcularPrecios(unProducto, cantidadSeleccionada);
                    dgvDetalle.Rows[CeldaActual.Y].Cells[2].Value = PrecioUnitario.ToString();
                    dgvDetalle.Rows[CeldaActual.Y].Cells[3].Value = (PrecioUnitario * cantidadSeleccionada).ToString();
                }

                this.CalcularTotales();
            }

        }
        #endregion Eventos

        #region Funciones Privadas
        private void CargarNumeroFactura()
        {
            this.txtNumero.Text = Facturas.CargarNumero(TiposFactura.A).ToString();
        }

        private Boolean CamposValidos()
        {
            Boolean CamposValidos = FuncionesFormulario.TodosLosCamposValidos(this._validaciones);
            CamposValidos &= (chkContado.Checked || chkCuentaCorriente.Checked);
            return (new CUIT(this.txtCUIT.Text)).EsValido && CamposValidos;
        }

        private void AgregarValidaciones()
        {
            this._validaciones.Add(Validacion.NuevaValidacion(this.txtNumero, TiposValidaciones.Requerido));
            this._validaciones.Add(Validacion.NuevaValidacion(this.txtDomicilio, TiposValidaciones.Requerido));
            this._validaciones.Add(Validacion.NuevaValidacion(this.txtLocalidad, TiposValidaciones.Requerido));
            this._validaciones.Add(Validacion.NuevaValidacion(this.txtCUIT, TiposValidaciones.Requerido));
            this._validaciones.Add(Validacion.NuevaValidacion(this.txtRemito, TiposValidaciones.Requerido));
        }

        private FacturaCabecera CrearCabecera()
        {
            CondicionesVenta CondicionVenta = this.chkContado.Checked ? CondicionesVenta.Contado : CondicionesVenta.CuentaCorriente;
            return FacturaCabecera.FacturaA(Convert.ToDateTime(this.dtpFecha.Text), Cliente.SinDatos(Convert.ToInt32(this.cmbRazonSocial.SelectedValue)), this.chkResponsableInscripto.Checked ? 1 : 0, this.txtRemito.Text, CondicionVenta, Convert.ToDouble(this.txtSubtotalGrilla.Text), Convert.ToDouble(this.txtImpuesto.Text), Convert.ToDouble(this.txtSubtotalImpuesto.Text), Convert.ToDouble(this.txtIVA.Text), Convert.ToDouble(this.txtSubtotalIVA.Text), Convert.ToDouble(this.txtTotal.Text));
        }

        private Double CalcularPrecios(Producto unProducto, int cantidad)
        {

            if (cantidad == 0)
                return unProducto.PrecioUnitario;

            Double Precio = 0;
            int cantidadEnPrecio = 0;
            foreach (PrecioPersonalizado unPrecio in unProducto.PreciosPersonalizados)
            {
                if (unPrecio.Cantidad < cantidad && (cantidadEnPrecio == 0 || unPrecio.Cantidad > cantidadEnPrecio))
                {
                    Precio = unPrecio.PrecioUnitario;
                    cantidadEnPrecio = unPrecio.Cantidad;
                }
            }

            return Precio > 0 ? Precio : unProducto.PrecioUnitario;
        }

        private FacturaDetalleElemento[] CrearListadoDeDetalles()
        {
            FacturaDetalleElemento[] Detalle = new FacturaDetalleElemento[this.dgvDetalle.Rows.Count - 1];
            Int32 a = 0;

            foreach (DataGridViewRow row in this.dgvDetalle.Rows)
            {
                if (Convert.ToInt32(row.Cells[0].Value) > 0 && Convert.ToInt32(row.Cells[1].Value) > 0)
                {
                    Detalle[a] = FacturaDetalleElemento.Nuevo(Convert.ToInt32(row.Cells[0].Value), Producto.SinDatos(Convert.ToInt32(row.Cells[1].Value)), Convert.ToDouble(row.Cells[2].Value), Convert.ToDouble(row.Cells[3].Value));
                    a++;
                }
            }

            return Detalle;
        }

        private void CargarCombos()
        {
            this.CargarProductos();
            this.CargarClientes();
        }

        private void LlenarCampos()
        {
            this.txtCUIT.Text = this.clienteAFacturar.CUIT.ToString();
            this.txtDomicilio.Text = this.clienteAFacturar.Direccion.ToString();
            this.txtLocalidad.Text = this.clienteAFacturar.Localidad.ToString();
            chkResponsableInscripto.Checked = true;
        }

        private void CargarProductos()
        {
            FuncionesFormulario.CargarCombo(this.colDescripcion, Productos.CargarTodos(false), "Nombre", "ID");
        }

        private void CargarClientes()
        {
            FuncionesFormulario.CargarCombo(this.cmbRazonSocial, Clientes.CargarActivosParaFacturar(true), "RazonSocial", "ID");
            
        }

        private Double CalcularSubtotal()
        {
            Double SubTotal = 0;
            foreach (DataGridViewRow row in this.dgvDetalle.Rows)
            {
                if (Convert.ToDouble(row.Cells[3].Value) > 0)
                {
                    SubTotal += Convert.ToDouble(row.Cells[3].Value);
                }
            }

            return SubTotal;
        }

        private void CalcularTotales()
        {
            this.txtSubtotalGrilla.Text = this.CalcularSubtotal().ToString();
            this.txtSubtotalImpuesto.Text = (Convert.ToDouble(this.txtSubtotalGrilla.Text) + Convert.ToDouble(this.txtSubtotalGrilla.Text) * Convert.ToDouble(this.txtImpuesto.Text) / 100).ToString();
            this.txtSubtotalIVA.Text = (Convert.ToDouble(this.txtSubtotalImpuesto.Text) + Convert.ToDouble(this.txtSubtotalImpuesto.Text) * Convert.ToDouble(this.txtIVA.Text) / 100).ToString();
            this.txtTotal.Text = this.txtSubtotalIVA.Text;
        }
        #endregion Funciones Privadas
    }
}
